package main

import (
	"bufio"
	"fmt"
	"io"
	"log"
	"os"
	"runtime"
	"time"
)

//定义数据读取的接口
type Reader interface {
	read(chan string)
}

//从文件数据库开始读入
type ReadLogFromFile struct {
	path string //文件路径
}

//实现从文件读取
func (r *ReadLogFromFile) read(rc chan string) {
	//打开文件
	file, e := os.Open(r.path)
	log.Println("成功打开文件，准备进行读取")
	if e != nil {
		log.Printf("open flie err =%v", e)
		panic(e)
	}
	//0 将下一个读或写文件的偏移量设置为offset，
	//2 根据来源：0表示相对于文件的来源，1表示相对于当前偏移，2表示相对于终点。
	file.Seek(0, os.SEEK_END)
	for {
		reader := bufio.NewReader(file)
		bytes, e := reader.ReadBytes('\n')
		if e == io.EOF { //表示读取 到文件末尾
			continue
		} else if e != nil { //非文件末尾  的异常
			panic(fmt.Sprintf("read file err= %v", e))
		}
		//去掉文件每行最后一个换行字符
		d := bytes[:len(bytes)-1]
		fmt.Println("read data =", string(d))
		rc <- string(d)
	}

	//rc <- r.path
}

//定义写的接口
type Writer interface {
	write(chan string)
}

//定时写influxdb 的结构体
type WriteDataInfluxDb struct {
	influxDb string //数据库的信息
}

//将数据写入 数据库
func (w *WriteDataInfluxDb) write(wc chan string) {
	for v := range wc {
		//写入数据库信息
		fmt.Println("write data=", v)
	}

}

//日志进行结构体
type logProcess struct {
	readChan  chan string //将读取的数据放入chan
	writeChan chan string //将要写入的数据放入chan
	read      Reader      //读的接口
	write     Writer      //写的接口
}

//处理日志信息
func (l *logProcess) Process() {

	//读取的数据循环放入
	for v := range l.readChan {
		l.writeChan <- fmt.Sprintf("%s %s", time.Now().Format("2006-01-02 15:04:05"), v)
	}

}

/*
1、定义读取的接口， 定义 文件读取结构体， 实现读取的接口中的读取方法
2、定义写数据的接口，定义 写数据库的结构体，实现写数据库的接口中的写数据方法
3、以后可以支撑 数据 读写的横向扩展
4、将读取的数据 ，放入写数据的 通道， 然后执行后面的程序


(1) 主程序主要用于给文件中写数据
(2) 其余协程处理以上
*/
func main() {

	file, e := os.Create("./22.txt")
	if e != nil {
		panic(e)
	}

	r := &ReadLogFromFile{
		path: "./22.txt",
	}
	w := &WriteDataInfluxDb{
		influxDb: "shujuku lianjiexixni ",
	}

	l := &logProcess{
		readChan:  make(chan string),
		writeChan: make(chan string),
		read:      r,
		write:     w,
	}
	//采用多协程 操作执行
	go l.read.read(l.readChan)
	go l.Process()
	go l.write.write(l.writeChan)

	for {
		time.Sleep(time.Second * 10)
		writer := bufio.NewWriter(file)

		d := []byte(time.Now().Format("2006-01-02 15:04:05") + " ruixule \n")
		fmt.Printf("write file=%s,MaxProcessNum=%d \n", string(d[:len(d)-1]), runtime.GOMAXPROCS(-1))
		writer.Write(d)
		//写完清空缓存
		writer.Flush()
	}
	//time.Sleep(time.Minute * 60)
}
